import store from '@/store'
import axios from 'axios';
// 添加拦截器
// 登录提醒
const loginTip = function () {
    uni.showModal({
        title: '您尚未登录，请先登录',
        content: '您尚未登录，请先登录',
        success: () => {
            store.dispatch('LogOut').then(() => {
                uni.navigateTo({
                    url: '/',
                });
            });
            // uni.navigateTo({
            //     url: '/pages/login/login',
            // });
        }
    })
}
const errorCode = {
    '401': '认证失败，无法访问系统资源',
    '403': '当前操作没有权限',
    '404': '访问资源不存在',
    'default': '系统未知错误，请反馈给管理员'
}
// const BASEURL = 'http://39.106.23.41:8077/arcback';
// const BASEURL = 'http://39.106.23.41:8077/arcback';
const BASEURL = 'http://192.168.1.101:8092'
// const BASEURL = '/arcback'

axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8';
// POST 请求头
// axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded'

// 创建axios实例
const service = axios.create({
    // axios中请求配置有baseURL选项，表示请求URL公共部分
    baseURL: BASEURL,
    // 超时
    timeout: 1000 * 20,
});

// request拦截器
service.interceptors.request.use(
    (config) => {
        // 是否需要设置 token
        const isToken = (config.headers || {}).isToken === false;
        const token = uni.getStorageSync('token')
        if (token && !isToken) {
            config.headers['Authorization'] = 'Bearer ' + token; // 让每个请求携带自定义token 请根据实际情况自行修改
        }
        return config;
    },
    (error) => {
        console.log(error);
        Promise.reject(error);
    }
);
// 响应拦截器
service.interceptors.response.use(
    (res) => {
        // debugger
        // 未设置状态码则默认成功状态
        const code = res.data.code || 200;
        // 获取错误信息
        const msg = errorCode[code] || res.data.msg || errorCode['default'];
        // 二进制数据则直接返回
        if (res.request.responseType === 'blob' || res.request.responseType === 'arraybuffer') {
            return res.data;
        }
        if (code === 401) {

            loginTip();

            return Promise.reject('无效的会话，或者会话已过期，请重新登录。');
        } else if (code === 500) {

            uni.showToast({
                title: msg,
                icon: 'error'
            })
            return Promise.reject('error');
        } else if (code === 601) {
            uni.showToast({
                title: msg,
                icon: 'error'
            })

            return Promise.reject('error');
        } else if (code !== 200) {
            uni.showToast({
                title: msg,
                icon: 'error'
            })
            return Promise.reject('error');
        } else {
            return res.data;
        }
    },
    (error) => {
        console.log('err' + error);
        let { message } = error;
        if (message == 'Network Error') {
            message = '后端接口连接异常';
        } else if (message.includes('timeout')) {
            message = '系统接口请求超时';
        } else if (message.includes('Request failed with status code')) {
            message = '系统接口' + message.substr(message.length - 3) + '异常';
        }
        uni.showToast({
            title: message,
            icon: "error",
        })
        return Promise.reject(error);
    }
);

/**
 * 封装 get方法 对应 GET 请求
 * @param {string} url 请求url
 * @param {object} params 查询参数
 * @returns {Promise}
 */
export function get(url, params) {
    return new Promise((resolve, reject) => {
        service({
            url,
            method: 'GET',
            params
        }).then((res) => {
            resolve(res)
        }).catch((err) => {
            reject(err)
        })


    })
}

/**
 * 封装 post 方法，对应 POST 请求
 * @param {string} url 请求url
 * @param {object} data 请求体
 * @param {boolean | undefined} info 请求体是否为 FormData 格式
 * @returns {Promise}
 */
export function post(url, data = {}, info) {
    return new Promise((resolve, reject) => {
        let newData = data
        if (info) {
            //  转formData格式
            newData = new FormData()
            for (let i in data) {
                newData.append(i, data[i])
            }
        }
        service({
            url,
            method: 'POST',
            data: newData
        }).then((res) => {
            resolve(res)
        }).catch((err) => {
            reject(err)
        })
    })
}

/**
 * 封装 put 方法，对应 PUT 请求
 * @param {string} url 请求url
 * @param {object} params 请求体
 * @returns {Promise}
 */
export function put(url, params = {}, header = {}) {
    return new Promise((resolve, reject) => {
        service({
            url,
            method: 'PUT',
            header,
            params
        }).then((res) => {
            resolve(res)
        }).catch((err) => {
            reject(err)
        })
    })
}

/**
 * 封装 axiosDelete 方法，对应 DELETE 请求
 * @param {string} url 请求url
 * @param {object} params 请求体
 * @returns {Promise}
 */
export function axiosDelete(url, params = {}) {
    return new Promise((resolve, reject) => {
        service({
            url,
            method: 'DELETE',
            params
        }).then((res) => {
            resolve(res)
        }).catch((err) => {
            reject(err)
        })
    })
}
